#include "gra.h"
gra::gra()
{
}

void gra::init(waz * wsk, apple * wskApp, menu * wskMen)
{
    allegro_init();
    install_keyboard();
    install_mouse();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    wsk->x=100;
    wsk->y=100;
    set_palette( default_palette );

    czcionka =load_font("czcionka.pcx",default_palette, NULL);
    if (!czcionka)
    {
        allegro_message( "Nie moge otworzyc czcionki !" );
        allegro_exit();
    }
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc bufora !" );
        allegro_exit();
    }
    planszaPoziom = load_bitmap("poziom.bmp", NULL);
    if( !planszaPoziom )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc planszy poziomej !" );
        allegro_exit();
    }
    planszaPion = load_bitmap("pion.bmp", NULL);
    if( !planszaPion )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc planszy pionowej !" );
        allegro_exit();
    }

    wskApp->app = load_bitmap("apple.bmp", NULL);
    if( !wskApp->app )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc owocu !" );
        allegro_exit();
    }
    wsk->element = load_bitmap("snake.bmp", NULL);
    if( !wsk->element )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc elementu !" );
        allegro_exit();
    }

    score = load_bitmap("bok.bmp", NULL);
    if( !score )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc boku !" );
        allegro_exit();
    }
    wsk->glowaLewo = load_bitmap("lewo.bmp", NULL);
    if( !wsk->glowaLewo )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc lewego elementu !" );
        allegro_exit();
    }
    wsk->glowaPrawo = load_bitmap("prawo.bmp", NULL);
    if( !wsk->glowaPrawo )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc prawego elementu !" );
        allegro_exit();
    }
    wsk->glowaDol = load_bitmap("dol.bmp", NULL);
    if( !wsk->glowaDol )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc dolnego elementu !" );
        allegro_exit();
    }
    wsk->glowaGora = load_bitmap("gora.bmp", NULL);
    if( ! wsk->glowaGora )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc gornego elementu !" );
        allegro_exit();
    }
    wskMen->StartOff = load_bitmap("StartOff.bmp", NULL);

    wskMen->StartOn = load_bitmap("StartOn.bmp", NULL);

    wskMen->ExitOff = load_bitmap("ExitOff.bmp", NULL);

    wskMen->ExitOn = load_bitmap("ExitOn.bmp", NULL);

    wskMen->tlo = load_bitmap("tlo.bmp", NULL);

    wskApp->app1 = load_bitmap("12v.bmp", NULL);
}

void gra::draw(waz * wsk, apple * wskApp)
{
    wsk->pozycjaWeza.push_front( make_pair(wsk->x,wsk->y) );
    //  wsk->pozycjaWeza.push_front( make_pair(wsk->x,wsk->y) );
    for(int i=wsk->pozycjaWeza.size(); i>=0; i--)
    {
        if(i==0 && wsk->b==1)
        {
            blit( wsk->glowaLewo, bufor, 0 , 0 , wsk->pozycjaWeza[i].first , wsk->pozycjaWeza[i].second, wsk->element->w, wsk->element->h);
        }

        else if(i==0 && wsk->b==2)
        {
            blit( wsk->glowaPrawo, bufor, 0 , 0 , wsk->pozycjaWeza[i].first ,wsk->pozycjaWeza[i].second, wsk->element->w, wsk->element->h);
        }

        else if(i==0 && wsk->b==3)
        {
            blit( wsk->glowaGora, bufor, 0 , 0 , wsk->pozycjaWeza[i].first , wsk->pozycjaWeza[i].second, wsk->element->w, wsk->element->h);
        }

        else if(i==0 && wsk->b==4)
        {
            blit( wsk->glowaDol, bufor, 0 , 0 ,wsk->pozycjaWeza[i].first , wsk->pozycjaWeza[i].second, wsk->element->w, wsk->element->h);
        }
        else
        {

            blit( wsk->element, bufor, 0 , 0 , wsk->pozycjaWeza[i].first , wsk->pozycjaWeza[i].second, wsk->element->w, wsk->element->h);
        }

    }
    if(((wsk->pozycjaWeza[0].first !=wskApp->pozycjaOwocu[0].first)|| (wsk->pozycjaWeza[0].second !=wskApp->pozycjaOwocu[0].second)))
    {
        wsk->pozycjaWeza.pop_back();
    }


    if ((wsk->pozycjaWeza[0].first ==wskApp->pozycjaOwocu[0].first)&& (wsk->pozycjaWeza[0].second ==wskApp->pozycjaOwocu[0].second))
    {

        wskApp->eat();
        this->punkty++;
        wskApp->losuj(wsk, this->bufor);
        wskApp->losujbon();
    }
    else if ((wsk->pozycjaWeza[0].first ==wskApp->pozycjaBonus[0].first)&& (wsk->pozycjaWeza[0].second ==wskApp->pozycjaBonus[0].second))
    {
        wskApp->eatbon();
        this->punkty+=3;
        if(wsk->pozycjaWeza.size()>6)
        {
            wsk->pozycjaWeza.pop_back();
            wsk->pozycjaWeza.pop_back();
        }
    }


    if(wskApp->q==0)
    {
        if(this->timer%180)
        {
            masked_blit( wskApp->app1, bufor, 0 , 0 , wskApp->pozycjaBonus[0].first , wskApp->pozycjaBonus[0].second, wskApp->app1->w, wskApp->app1->h);
        }
        else
        {
            wskApp->pozycjaBonus.pop_back();
            this->timer=0;
            wskApp->q=1;
        }

    }

    masked_blit( wskApp->app, bufor, 0 , 0 , wskApp->pozycjaOwocu[0].first , wskApp->pozycjaOwocu[0].second, wskApp->app->w, wskApp->app->h);
    blit( score, bufor, 0, 0 , 600 , 0,  score->w, score->h);
    blit( planszaPoziom, bufor, 0 , 0 , 0 , 0, planszaPoziom->w, planszaPoziom->h);
    blit( planszaPoziom, bufor, 0, 0 , 0 , 580,  planszaPoziom->w, planszaPoziom->h);
    blit( planszaPion, bufor, 0, 0 , 0 , 0,  planszaPion->w, planszaPion->h);
    blit( planszaPion, bufor, 0, 0 , 600 , 0,  planszaPion->w, planszaPion->h);
    textprintf_ex(bufor, czcionka, 650, 50, makecol(255,255,128), -1, "Punkty: %d",this->punkty);
    masked_blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    clear_bitmap(bufor);
    rest(80);
    this->timer++;
}

bool gra::przegrana(waz * wsk)
{
    int r=wsk->pozycjaWeza.size();
    if ((wsk->pozycjaWeza[0].first==0) || (wsk->pozycjaWeza[0].second==580) || (wsk->pozycjaWeza[0].first>590) || (wsk->pozycjaWeza[0].second==0))
    {
        return true;
    }
    if(r>0)
    {
        for(int i=wsk->pozycjaWeza.size(); i>=1; i--)
        {
            if((wsk->pozycjaWeza[0].first==wsk->pozycjaWeza[i].first)&& (wsk->pozycjaWeza[0].second== wsk->pozycjaWeza[i].second))

                return true;


        }
    }
    return false;
}
